{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Python语言-变量\n",
    "\n",
    "作为一个程序员，可能经常会被外行人问到两个问题，其一是“什么是（计算机）程序”，其二是“写（计算机）程序能做什么”，这里我们先对两个问题做一个回答。**程序是指令的集合**，**写程序就是用指令控制计算机做我们想让它做的事情**。那么，为什么要用Python语言来写程序呢？因为**Python语言简单优雅**，相比C、C++、Java这样的编程语言，**Python对初学者更加友好**，当然这并不是说Python不像其他语言那样强大，**Python几乎是无所不能的**，在第一节课的时候，我们就说到了Python可以用于服务器程序开发、云平台开发、数据分析、机器学习等各个领域。当然，Python语言还可以用来粘合其他语言开发的系统，所以也经常被戏称为“**胶水语言**”。\n",
    "\n",
    "### 一些计算机常识\n",
    "\n",
    "在开始系统的学习编程之前，我们先来科普一些计算机的基础知识。计算机的硬件系统通常由五大部件构成，包括：**运算器**、**控制器**、**存储器**、**输入设备**和**输出设备**。其中，运算器和控制器放在一起就是我们常说的**中央处理器**，它的功能是执行各种运算和控制指令。刚才我们提到过程序是指令的集合，写程序就是将一系列的指令按照某种方式组织到一起，然后通过这些指令去控制计算机做我们想让它做的事情。目前，我们使用的计算机基本都是“冯·诺依曼体系结构”的计算机，这种计算机有两个关键点：一是要将**存储设备与中央处理器分开**；二是将**数据以二进制方式编码**。\n",
    "\n",
    "二进制是一种“逢二进一”的计数法，跟我们人类使用的“逢十进一”的计数法本质是一样的。人类因为有十根手指所以使用了十进制，因为在计数时十根手指用完之后就只能用进位的方式来表示更大的数值。当然凡事都有例外，玛雅人可能是因为长年光着脚的原因，把脚趾头也都用上了，于是他们使用了二十进制的计数法。在这种计数法的指导下，玛雅人的历法就与我们平常使用的历法并不相同。按照玛雅人的历法，2012年是上一个所谓的“太阳纪”的最后一年，而2013年则是新的“太阳纪”的开始，后来这件事情被以讹传讹的方式误传为”2012年是玛雅人预言的世界末日“的荒诞说法。今天很多人都在猜测，玛雅文明之所以发展缓慢跟使用了二十进制是有关系的。对于计算机来说，二进制在物理器件上最容易实现的，因为可以用高电压表示1，用低电压表示0。不是所有写程序的人都需要知道十进制与二进制如何转换，大多数时候我们即便不了解这些知识也能写出程序，但是我们必须要知道**计算机是使用二进制计数的**，不管什么**数据到了计算机内存中都是以二进制形式存在的**。\n",
    "\n",
    "### 变量和类型\n",
    "\n",
    "要想在计算机内存中保存数据，首先就得说一说变量这个概念。在编程语言中，**变量是数据的载体**，简单的说就是一块用来保存数据的内存空间，**变量的值可以被读取和修改**，这是所有计算和控制的基础。计算机能处理的数据有很多种类型，最常见的就是数值，除了数值之外还有文本、图形、音频、视频等各种各样的数据。虽然数据在计算机中都是以二进制形态存在的，但是我们可以用不同类型的变量来表示数据类型的差异。**Python中的数据类型很多**，而且也**允许我们自定义新的数据类型**（这一点在后面会讲到），这里我们需要先了解几种常用的数据类型。\n",
    "\n",
    "- 整型（int）：Python中可以处理任意大小的整数，而且支持二进制（如`0b100`，换算成十进制是4）、八进制（如`0o100`，换算成十进制是64）、十进制（`100`）和十六进制（`0x100`，换算成十进制是256）的表示法。\n",
    "- 浮点型（float）：浮点数也就是小数，之所以称为浮点数，是因为按照科学记数法表示时，一个浮点数的小数点位置是可变的，浮点数除了数学写法（如`123.456`）之外还支持科学计数法（如`1.23456e2`）。\n",
    "- 字符串型（str）：字符串是以单引号或双引号括起来的任意文本，比如`'hello'`和`\"hello\"`。\n",
    "- 布尔型（bool）：布尔值只有`True`、`False`两种值，要么是`True`，要么是`False`。\n",
    "- 后面会学到**高级变量类型**: 列表、元组、字典、集合\n",
    "\n",
    "### 变量命名\n",
    "\n",
    "对于每个变量我们需要给它取一个名字，就如同我们每个人都有自己的名字一样。在Python中，变量命名需要遵循以下这些规则，这些规则又分为必须遵守的硬性规则和建议遵守的非硬性规则。\n",
    "\n",
    "- 硬性规则：\n",
    "  - 规则1：变量名由**字母**、数字和**下划线**构成，数字不能开头。需要说明的是，这里说的字母指的是Unicode字符，Unicode称为万国码，囊括了世界上大部分的文字系统，这也就意味着中文、日文、希腊字母等都可以作为变量名中的字符，但是像`!`、`@`、`#`这些特殊字符是不能出现在变量名中的，而且我们强烈建议大家**尽可能使用英文字母**。\n",
    "  - 规则2：**大小写敏感**，简单的说就是大写的`A`和小写的`a`是两个不同的变量。\n",
    "  - 规则3：变量名**不要跟Python语言的关键字**（有特殊含义的单词，后面会讲到）和**保留字**（如函数、模块等的名字）**发生重名的冲突**。\n",
    "- 非硬性规则：\n",
    "  - 规则1：变量名通常使用小写英文字母，多个单词用下划线进行连接。\n",
    "  - 规则2：受保护的变量用单个下划线开头（后面会讲到）。\n",
    "  - 规则3：私有的变量用两个下划线开头（后面会讲到）。\n",
    "\n",
    "当然，作为一个专业的程序员，给变量（事实上应该是所有的标识符）命名时做到**见名知意**也非常重要。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "### 变量的使用\n",
    "\n",
    "下面通过例子来说明变量的类型和变量的使用。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = 45          # 变量a保存了45\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = 12          # 变量b保存了12\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "57\n"
     ]
    }
   ],
   "source": [
    "print(a + b)    # 57"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "33\n"
     ]
    }
   ],
   "source": [
    "print(a - b)    # 33"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "540\n"
     ]
    }
   ],
   "source": [
    "print(a * b)    # 540"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.75\n"
     ]
    }
   ],
   "source": [
    "print(a / b)    # 3.75"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在Python中可以使用`type`函数对变量的类型进行检查。程序设计中函数的概念跟数学上函数的概念基本一致，数学上的函数相信大家并不陌生，它包括了函数名、自变量和因变量。如果暂时不理解函数这个概念也不要紧，我们会在后续的内容中专门讲解函数的定义和使用。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'int'>\n",
      "<class 'float'>\n",
      "<class 'str'>\n",
      "<class 'bool'>\n"
     ]
    }
   ],
   "source": [
    "a = 100\n",
    "b = 12.345\n",
    "c = 'hello, world'\n",
    "d = True\n",
    "print(type(a))    # <class 'int'>\n",
    "print(type(b))    # <class 'float'>\n",
    "print(type(c))    # <class 'str'>\n",
    "print(type(d))    # <class 'bool'>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "不同类型的变量可以相互转换，这一点可以通过Python的内置函数来实现。\n",
    "\n",
    "- `int()`：将一个数值或字符串转换成整数，可以指定进制。\n",
    "- `float()`：将一个字符串转换成浮点数。\n",
    "- `str()`：将指定的对象转换成字符串形式，可以指定编码。\n",
    "- `chr()`：将整数转换成该编码对应的字符串（一个字符）。\n",
    "- `ord()`：将字符串（一个字符）转换成对应的编码（整数）。\n",
    "\n",
    "下面的例子为大家演示了Python中类型转换的操作。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100.0\n",
      "12.345\n",
      "True\n",
      "1\n",
      "a\n",
      "97\n"
     ]
    }
   ],
   "source": [
    "a = 100\n",
    "b = 12.345\n",
    "c = 'hello, world'\n",
    "d = True\n",
    "# 整数转成浮点数\n",
    "print(float(a))    # 100.0\n",
    "# 浮点型转成字符串 (输出字符串时不会看到引号哟)\n",
    "print(str(b))      # 12.345\n",
    "# 字符串转成布尔型 (有内容的字符串都会变成True)\n",
    "print(bool(c))     # True\n",
    "# 布尔型转成整数 (True会转成1，False会转成0)\n",
    "print(int(d))      # 1\n",
    "# 将整数变成对应的字符 (97刚好对应字符表中的字母a)\n",
    "print(chr(97))     # a\n",
    "# 将字符转成整数 (Python中字符和字符串表示法相同)\n",
    "print(ord('a'))    # 97"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 变量格式化输出\n",
    "* 在 Python 中可以使用 `print` 函数将信息输出到控制台\n",
    "* 如果希望输出文字信息的同时，**一起输出** **数据**，就需要使用到 **格式化操作符**\n",
    "* `%` 被称为 **格式化操作符**，专门用于处理字符串中的格式\n",
    "    * 包含 `%` 的字符串，被称为 **格式化字符串**\n",
    "    * `%` 和不同的 **字符** 连用，**不同类型的数据** 需要使用 **不同的格式化字符**\n",
    "\n",
    "| 格式化字符 | 含义 |\n",
    "| --- | --- |\n",
    "| %s | 字符串 |\n",
    "| %d | 有符号十进制整数，`%06d` 表示输出的整数显示位数，不足的地方使用 `0` 补全 |\n",
    "| %f | 浮点数，`%.2f` 表示小数点后只显示两位 |\n",
    "| %% | 输出 `%` |\n",
    "\n",
    "* 语法格式如下：\n",
    "\n",
    "```python\n",
    "print(\"格式化字符串\" % 变量1)\n",
    "\n",
    "print(\"格式化字符串\" % (变量1, 变量2...))\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "变量a的值是100\n"
     ]
    }
   ],
   "source": [
    "print('变量a的值是%s' % a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100\n"
     ]
    }
   ],
   "source": [
    "print(\"{}\".format(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10012.345hello, world\n"
     ]
    }
   ],
   "source": [
    "print(\"{}{}{}\".format(a,b,c))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10012.345hello, world\n"
     ]
    }
   ],
   "source": [
    "print(f'{a}{b}{c}')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
